Warning: file_put_contents(aCache/aDaily/post/database_info/--): Failed to open stream: No space left on device in /var/www/tg-me/post.php on line 50
Базы данных (Data Base) | Telegram Webview: database_info/1478 -
Telegram Group & Telegram Channel
Антипаттерн: N+1 запросов и как его избежать

Что такое N+1?
При выборке связанных данных ORM (или вручную) сначала делается 1 запрос за основными записями, а потом N дополнительных — по одной для каждой записи, чтобы получить связанные объекты. Например, получить 10 пользователей и для каждого — список их заказов ⇒ 1 запрос к users + 10 запросов к orders. 🚩


# SQLAlchemy-пример “N+1”:
users = session.query(User).all() # 1 запрос
for u in users:
print(u.orders) # для каждого пользователя — отдельный запрос


Почему плохо?

🔹 Высокая нагрузка на базу: запросы “в тоненькую” вместо одного “тяжелого”.
🔹 Задержки сети: множество раунд-трипов увеличивает время ответа.
🔹 Масштабируемость страдает: при росте N время растёт линейно.

Как победить N+1

1. Eager loading (предварительная загрузка)
Загрузка связей сразу вместе с основными объектами.


# SQLAlchemy, joinedload — делает JOIN и подтягивает данные сразу
from sqlalchemy.orm import joinedload

users = session.query(User).options(joinedload(User.orders)).all()
for u in users:
print(u.orders) # не генерирует дополнительных запросов


Сокращает число запросов до 1.

2. Batch loading (групповые запросы)
Если JOIN приводит к дублированию полей, можно сделать два запроса:


-- 1: получить user_id
SELECT id FROM users WHERE active = true;
-- 2: получить все заказы для этих пользователей
SELECT * FROM orders WHERE user_id IN (...список id...);


Баланс между сложностью и производительностью.

3. DataLoader / кеширование
В GraphQL и приложениях на Node.js часто используют DataLoader:

🔹 Собирает все ключи за тиковый цикл
🔹 Делает один общий запрос
🔹 Раздаёт результаты обратно

4. Правильное проектирование API
— Предусматривайте, какие связи нужны на фронтенде, и загружайте их сразу.
— Разделяйте endpoints: если нужны только пользователи без заказов — делайте лёгкий запрос.

Best practices & подводные камни

🔹 EXPLAIN ANALYZE для проверки плана: убедитесь, что JOIN-ы и IN (…) не приводят к полному сканированию таблиц.
🔹 Пагинация: всегда ограничивайте выборку через LIMIT/OFFSET или курсоры.
🔹 Будьте осторожны с joinedload на “много ко многим” — может раздувать размер результата.

Сохрани этот пост, чтобы не забыть, и поделись с коллегами!
А у тебя были случаи, когда N+1 съедал всю производительность? Как борешься?

#db

👉 @database_info



tg-me.com/database_info/1478
Create:
Last Update:

Антипаттерн: N+1 запросов и как его избежать

Что такое N+1?
При выборке связанных данных ORM (или вручную) сначала делается 1 запрос за основными записями, а потом N дополнительных — по одной для каждой записи, чтобы получить связанные объекты. Например, получить 10 пользователей и для каждого — список их заказов ⇒ 1 запрос к users + 10 запросов к orders. 🚩


# SQLAlchemy-пример “N+1”:
users = session.query(User).all() # 1 запрос
for u in users:
print(u.orders) # для каждого пользователя — отдельный запрос


Почему плохо?

🔹 Высокая нагрузка на базу: запросы “в тоненькую” вместо одного “тяжелого”.
🔹 Задержки сети: множество раунд-трипов увеличивает время ответа.
🔹 Масштабируемость страдает: при росте N время растёт линейно.

Как победить N+1

1. Eager loading (предварительная загрузка)
Загрузка связей сразу вместе с основными объектами.


# SQLAlchemy, joinedload — делает JOIN и подтягивает данные сразу
from sqlalchemy.orm import joinedload

users = session.query(User).options(joinedload(User.orders)).all()
for u in users:
print(u.orders) # не генерирует дополнительных запросов


Сокращает число запросов до 1.

2. Batch loading (групповые запросы)
Если JOIN приводит к дублированию полей, можно сделать два запроса:


-- 1: получить user_id
SELECT id FROM users WHERE active = true;
-- 2: получить все заказы для этих пользователей
SELECT * FROM orders WHERE user_id IN (...список id...);


Баланс между сложностью и производительностью.

3. DataLoader / кеширование
В GraphQL и приложениях на Node.js часто используют DataLoader:

🔹 Собирает все ключи за тиковый цикл
🔹 Делает один общий запрос
🔹 Раздаёт результаты обратно

4. Правильное проектирование API
— Предусматривайте, какие связи нужны на фронтенде, и загружайте их сразу.
— Разделяйте endpoints: если нужны только пользователи без заказов — делайте лёгкий запрос.

Best practices & подводные камни

🔹 EXPLAIN ANALYZE для проверки плана: убедитесь, что JOIN-ы и IN (…) не приводят к полному сканированию таблиц.
🔹 Пагинация: всегда ограничивайте выборку через LIMIT/OFFSET или курсоры.
🔹 Будьте осторожны с joinedload на “много ко многим” — может раздувать размер результата.

Сохрани этот пост, чтобы не забыть, и поделись с коллегами!
А у тебя были случаи, когда N+1 съедал всю производительность? Как борешься?

#db

👉 @database_info

BY Базы данных (Data Base)




Share with your friend now:
tg-me.com/database_info/1478

View MORE
Open in Telegram


Базы данных Data Base Telegram | DID YOU KNOW?

Date: |

NEWS: Telegram supports Facetime video calls NOW!

Secure video calling is in high demand. As an alternative to Zoom, many people are using end-to-end encrypted apps such as WhatsApp, FaceTime or Signal to speak to friends and family face-to-face since coronavirus lockdowns started to take place across the world. There’s another option—secure communications app Telegram just added video calling to its feature set, available on both iOS and Android. The new feature is also super secure—like Signal and WhatsApp and unlike Zoom (yet), video calls will be end-to-end encrypted.

Dump Scam in Leaked Telegram Chat

A leaked Telegram discussion by 50 so-called crypto influencers has exposed the extraordinary steps they take in order to profit on the back off unsuspecting defi investors. According to a leaked screenshot of the chat, an elaborate plan to defraud defi investors using the worthless “$Few” tokens had been hatched. $Few tokens would be airdropped to some of the influencers who in turn promoted these to unsuspecting followers on Twitter.

Базы данных Data Base from tw


Telegram Базы данных (Data Base)
FROM USA